package com.design.visitor;

import java.util.ArrayList;
import java.util.List;

/**
 * 访问者模式
 * 关键点:
 * 分离数据和操作：访问者模式将数据结构和数据操作分离，使得可以在不修改数据类的前提下，动态地添加新的操作。
 * 扩展性：通过添加新的访问者类，可以轻松地为现有对象结构添加新的操作，而无需修改现有的类。
 * 双分派机制：访问者模式利用了双分派机制，即首先通过 accept 方法将控制权传递给访问者对象，然后访问者对象再调用具体元素的相应方法。
 * 适用场景
 * 对象结构相对稳定，但经常需要在此对象结构上定义新的操作：访问者模式允许你在不修改对象结构的前提下添加新的操作。
 * 需要对一个对象结构中的对象进行大量不同的并且不相关的操作：通过定义不同的访问者类，可以避免在对象结构中添加大量的操作方法。
 * @author ytj
 * @date 2024/11/28 13:14
 */
public class VisitorTest {
    public static void main(String[] args) {
        List<User> list=new ArrayList<>();
        list.add(new Student("张三","重点班","一年级一班"));
        list.add(new Student("李四","普通班","二年级一班"));
        list.add(new Teacher("张三老师","特级教师","一年级一班"));
        list.add(new Teacher("李四老师","普通老师","二年级一班"));
        for (User user : list) {
            user.accept(new PrincipalVisitor());
        }
        for (User user : list) {
            user.accept(new ParentsVisitor());
        }
    }
}
